home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / buzzmachines_massive.exe / Dev / Overloader - Multitrack Raw Recorder / multitrackraw.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-03  |  9.6 KB  |  348 lines

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. #include "resource.h"
  6.   
  7. double const PI = 3.14159265358979323846;
  8.  
  9. HINSTANCE dllInstance;
  10.  
  11. #define MAX_BUFFER_LENGTH        256            // in number of samples
  12.  
  13. class COOERecorder {
  14. public:
  15.     virtual bool __cdecl Init();
  16.  
  17.     virtual bool __cdecl IsMultiTrack();
  18.     virtual bool __cdecl IsTagged();
  19.     virtual bool __cdecl IsStreamed();
  20.     virtual bool __cdecl IsRequiresWaveout();
  21.     virtual bool __cdecl IsLossyCompression();
  22.  
  23.     virtual bool __cdecl IsSampleRateChangeable();
  24.     virtual bool __cdecl SampleRateChanged(int samplerate);
  25.     virtual bool __cdecl IsBitRateChangeable();
  26.     virtual bool __cdecl BitRateChanged(int bitrate);
  27.  
  28.     virtual bool __cdecl SupportsSampleRate(int samplerate);
  29.     virtual bool __cdecl SupportsBitRate(int bitrate);
  30.  
  31.     virtual bool __cdecl SaveAs(HWND parentwindow);
  32.     virtual bool __cdecl ReadyToRec();
  33.  
  34.     virtual bool __cdecl TrackNames(int track_id, char *track_name);
  35.     virtual bool __cdecl SongTagData(int tag_index, char *tagdata);
  36.  
  37.     virtual bool __cdecl Start(char * filename, int samplespersec);
  38.     virtual bool __cdecl WorkOutput(float *psamples, int numsamples);
  39.     virtual bool __cdecl WorkOutputMulti(int track_id, float *psamples, int numsamples);
  40.  
  41.     virtual bool __cdecl Finish();
  42.     virtual void __cdecl ConfigDlg(HWND parentwindow);
  43.     virtual void __cdecl DispatchCommand(int command_id, int param1, int param2, int param3, int param4);
  44.     virtual void __cdecl DispatchCommandEx(char * str_command, char * str_value);
  45.  
  46.     virtual void __cdecl LoadSettings(char * settingsname, char *username, char *domain);
  47.     virtual void __cdecl SaveSettings(char * settingsname, char *username, char *domain);
  48.  
  49.     virtual char * __cdecl OutputFilename();
  50.     virtual char * __cdecl OutputSize();
  51.     virtual char * __cdecl ExtraInfo(int extra_info_id);
  52.     virtual char * __cdecl RecordersWebSiteURL();
  53.  
  54.     virtual int __cdecl RecorderVersion();
  55.  
  56.     virtual void GetRecorderExtensionsClass(int param, void **exmodule);
  57. };
  58.  
  59. class rec : public COOERecorder {
  60. public:
  61.     virtual bool __cdecl Init();
  62.  
  63.     virtual bool __cdecl IsMultiTrack() { return true; };
  64.     virtual bool __cdecl IsTagged() { return false; };
  65.     virtual bool __cdecl IsStreamed() { return false; };
  66.     virtual bool __cdecl IsRequiresWaveout() { return false; };
  67.     virtual bool __cdecl IsLossyCompression() { return false; };
  68.  
  69.     virtual bool __cdecl IsSampleRateChangeable() { return false; };
  70.     virtual bool __cdecl SampleRateChanged(int samplerate) { return false; };
  71.     virtual bool __cdecl IsBitRateChangeable() { return false; };
  72.     virtual bool __cdecl BitRateChanged(int bitrate) { return false; };
  73.  
  74.     virtual bool __cdecl SupportsSampleRate(int samplerate) { return true; };
  75.     virtual bool __cdecl SupportsBitRate(int bitrate) { return true; };
  76.  
  77.     virtual bool __cdecl SaveAs(HWND parentwindow);
  78.     virtual bool __cdecl ReadyToRec();
  79.  
  80.     virtual bool __cdecl TrackNames(int track_id, char *track_name);
  81.     virtual bool __cdecl SongTagData(int tag_index, char *tagdata) { return false; };
  82.  
  83.     virtual bool __cdecl Start(char * filename, int samplespersec);
  84.     virtual bool __cdecl WorkOutput(float *psamples, int numsamples);
  85.     virtual bool __cdecl WorkOutputMulti(int track_id, float *psamples, int numsamples);
  86.  
  87.     virtual bool __cdecl Finish();
  88.     virtual void __cdecl ConfigDlg(HWND parentwindow);
  89.     virtual void __cdecl DispatchCommand(int command_id, int param1, int param2, int param3, int param4);
  90.     virtual void __cdecl DispatchCommandEx(char * str_command, char * str_value);
  91.  
  92.     virtual void __cdecl LoadSettings(char * settingsname, char *username, char *domain) { };
  93.     virtual void __cdecl SaveSettings(char * settingsname, char *username, char *domain) { };
  94.  
  95.     virtual char * __cdecl OutputFilename();
  96.     virtual char * __cdecl OutputSize();
  97.     virtual char * __cdecl ExtraInfo(int extra_info_id) { return "No Extra Info"; };
  98.     virtual char * __cdecl RecordersWebSiteURL() { return "http://www.buzzscene.ca/"; };
  99.  
  100.     virtual int __cdecl RecorderVersion() { return 100; };
  101.  
  102.     virtual void GetRecorderExtensionsClass(int param, void **exmodule) { };
  103. public:
  104.     char myfilename[MAX_PATH];
  105.     char tracknames[65][100];
  106.     char trackused[65];
  107.     FILE * myfilehandle[65];
  108.     unsigned int writtensofar[65];
  109. //    int bitdepth;
  110. };
  111.  
  112. bool rec::Init(){
  113.     int i;
  114.     sprintf(myfilename, "");
  115.     writtensofar[64] = 0;
  116.     trackused[64] = 1;
  117.     myfilehandle[64] = NULL;
  118.     for (i = 0; i < 64; i++) {
  119.         myfilehandle[i] = NULL;
  120.         writtensofar[i] = 0;
  121.         trackused[i] = 0;
  122.         sprintf(tracknames[i], "");
  123.     }
  124.     return true;
  125. }
  126.  
  127. bool rec::TrackNames(int track_id, char *track_name) {
  128.     trackused[track_id] = 1;
  129.     sprintf(tracknames[track_id], track_name);
  130.     return true;
  131. }
  132.  
  133. bool rec::SaveAs(HWND parentwindow) {
  134.     OPENFILENAME ofl;
  135.     char filename[255];
  136.     int nSuccess;
  137.  
  138.     sprintf(filename,"Base Filename.raw");
  139.     ofl.lStructSize = sizeof(ofl);
  140.     ofl.hwndOwner = parentwindow;
  141.     ofl.hInstance = dllInstance;
  142.     ofl.lpstrFilter = "Raw 16-bit data (*.raw)\0*.raw\0";
  143.     ofl.lpstrCustomFilter = NULL;
  144.     ofl.nMaxCustFilter = NULL;
  145.     ofl.nFilterIndex = 1;
  146.     ofl.lpstrFile = filename;
  147.     ofl.nMaxFile = 255;
  148.     ofl.lpstrFileTitle = NULL;
  149.     ofl.nMaxFileTitle = NULL;
  150.     ofl.lpstrInitialDir = NULL;
  151.     ofl.lpstrTitle = "Save Base Filename Output as";
  152.     ofl.Flags = OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST;
  153.     ofl.nFileOffset = 0;
  154.     ofl.nFileExtension = 0;
  155.     ofl.lpstrDefExt = ".raw";
  156.     ofl.lCustData = NULL;
  157.     ofl.lpfnHook = NULL;
  158.     ofl.lpTemplateName = NULL;
  159.     nSuccess = GetSaveFileName(&ofl);
  160.     if (nSuccess == 0) {
  161.         sprintf(myfilename, "");
  162.     } else {
  163.         sprintf(myfilename, ofl.lpstrFile);
  164.     }
  165.     return true;
  166. }
  167. char *rec::OutputFilename() {
  168.     return myfilename;
  169. }
  170. bool rec::Start (char * filename, int samplespersec) {
  171.     char basefilename[256];
  172.     char bufferfilen[256];
  173.     int i;
  174.  
  175.  
  176.     myfilehandle[64] = fopen(filename, "wb");
  177.     writtensofar[64] = 0;
  178.  
  179.     sprintf(basefilename, filename);
  180.     basefilename[strlen(filename) - 4] = 0;
  181.     for (i = 0; i < 64; i++) {
  182.         if (trackused[i] == 1) {
  183.             sprintf(bufferfilen, "%s - %s.raw", basefilename, tracknames[i]);
  184.             myfilehandle[i] = fopen(bufferfilen, "wb");
  185.             writtensofar[i] = 0;
  186.         }
  187.     }
  188.  
  189.     for (i = 0; i < 65; i++) {
  190.         if (trackused[i] == 1) {
  191.             // stick stuff here for headers, raw files dont
  192.             // have headers tho
  193.         }
  194.     }
  195.  
  196.     return true;
  197. }
  198. bool rec::ReadyToRec() {
  199.     if (strcmp(myfilename, "") == 0) {
  200.         return false;
  201.     } else {
  202.         return true;
  203.     }
  204.  
  205. }
  206.  
  207. // This is whatever is outputed through the Track machines
  208. bool rec::WorkOutputMulti(int track_id, float *psamples, int numsamples) {
  209.     short psampsm[1024];
  210.     for (int i = 0; i < (numsamples * 2); i++) {
  211.         if (psamples[i] > 32767.0f) psamples[i] = 32767.0f;
  212.         if (psamples[i] < -32766.0f) psamples[i] = -32766.0f;
  213.         psampsm[i] = (short)psamples[i];
  214.     }
  215.     writtensofar[track_id] += numsamples;
  216.     fwrite(psampsm, sizeof(short), numsamples * 2,myfilehandle[track_id]);
  217.     return true;
  218. }
  219.  
  220. // This is whatever gets outputed through the Master machine
  221. bool rec::WorkOutput (float *psamples, int numsamples) {
  222.     short psampsm[1024];
  223.     for (int i = 0; i < (numsamples * 2); i++) {
  224.         if (psamples[i] > 32767.0f) psamples[i] = 32767.0f;
  225.         if (psamples[i] < -32766.0f) psamples[i] = -32766.0f;
  226.         psampsm[i] = (short)psamples[i];
  227.     }
  228.     writtensofar[64] += numsamples;
  229.     fwrite(psampsm, sizeof(short), numsamples * 2,myfilehandle[64]);
  230.     return true;
  231. }
  232.  
  233. bool rec::Finish() {
  234.     int i;
  235.     for (i = 0; i < 65; i++) {
  236.         if (trackused[i] == 1) {
  237.             // write your footer for each file here
  238.             // raw files dont have footers tho
  239.  
  240.             fflush(myfilehandle[i]);
  241.             fclose(myfilehandle[i]);
  242.         }
  243.     }
  244.     return true;
  245. }
  246.  
  247. char * rec::OutputSize() {
  248.     static char megs[32];
  249.     sprintf(megs, "%.2fM", ((float)writtensofar[64] * 4.0f / 1024.0f / 1024.0f));
  250.     return megs;
  251. }
  252.  
  253. rec *prec;
  254.  
  255. BOOL APIENTRY ConfigDialog (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  256.     switch(uMsg) {
  257.     case WM_INITDIALOG:
  258.     {
  259.         return 1;
  260.     }
  261.     case WM_SHOWWINDOW:
  262.     {
  263.         return 1;
  264.     }
  265.     case WM_CLOSE:
  266.     {
  267.         EndDialog (hDlg, TRUE);
  268.     }
  269.     case WM_COMMAND:
  270.         switch ( LOWORD (wParam))
  271.         {
  272.         case IDOK:
  273.             EndDialog (hDlg, TRUE);
  274.             break;
  275.         case IDCANCEL:
  276.             EndDialog (hDlg, TRUE);
  277.             break;
  278.         default:
  279.             return 0;
  280.         }
  281.         break;
  282.     }
  283.     return 0;
  284. }
  285.  
  286. BOOL APIENTRY AboutDialog (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  287.     switch(uMsg) {
  288.     case WM_INITDIALOG:
  289.     {
  290.         return 1;
  291.     }
  292.     case WM_SHOWWINDOW:
  293.     {
  294.         return 1;
  295.     }
  296.     case WM_CLOSE:
  297.     {
  298.         EndDialog (hDlg, TRUE);
  299.     }
  300.     case WM_COMMAND:
  301.         switch ( LOWORD (wParam))
  302.         {
  303.         case IDOK:
  304.             EndDialog (hDlg, TRUE);
  305.             break;
  306.         case IDCANCEL:
  307.             EndDialog (hDlg, TRUE);
  308.             break;
  309.         default:
  310.             return 0;
  311.         }
  312.         break;
  313.     }
  314.     return 0;
  315. }
  316.  
  317. void rec::ConfigDlg (HWND parentwindow) {
  318.     prec = this;
  319.     DialogBox(dllInstance, MAKEINTRESOURCE (IDD_CONFIG), parentwindow, (DLGPROC) &ConfigDialog);
  320. }
  321.  
  322. void rec::DispatchCommand(int command_id, int param1, int param2, int param3, int param4) {
  323.  
  324. }
  325.  
  326. void rec::DispatchCommandEx(char * str_command, char * str_value) { 
  327.     if (strcmp(str_command, "about") == 0) {
  328.         HWND parentwindow = *(HWND*)str_value;
  329.         DialogBox(dllInstance, MAKEINTRESOURCE (IDD_ABOUTBOX), parentwindow, (DLGPROC) &AboutDialog);
  330.     }
  331. }
  332.  
  333. extern "C" {
  334. __declspec(dllexport) COOERecorder * __cdecl CreateRecorder() { return new rec; }
  335. __declspec(dllexport) char * __cdecl RecInfo() { return "Multitrack Raw Recorder by CyanPhase"; }
  336. }
  337.  
  338. BOOL WINAPI DllMain ( HANDLE hModule, DWORD fwdreason, LPVOID lpReserved )
  339. {
  340.     switch (fwdreason) {
  341.     case DLL_PROCESS_ATTACH: { dllInstance = (HINSTANCE) hModule; } break;
  342.     case DLL_THREAD_ATTACH: break;
  343.     case DLL_THREAD_DETACH: break;
  344.     case DLL_PROCESS_DETACH: break;
  345.     }
  346.     return TRUE;
  347. }
  348.